package com.example.pojo;

import java.net.InetAddress;
import java.util.List;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.bind.ConstructorBinding;
import org.springframework.boot.context.properties.bind.DefaultValue;

/**
 * 使用了构造函数绑定，取消setter方法，只保留getter方法。
 */
@ConfigurationProperties("my.service2")
public class MyProperties2 {

    private  boolean enabled;

    private  InetAddress remoteAddress;

    private  Security security;


    /**
     * 存在单一参数化构造函数意味着应该使用构造函数绑定
     * 如果您的类有多个构造函数，可以使用 @ConstructorBinding 注解来指定要用于构造函数绑定的构造函数。
     *
     * @param enabled
     * @param remoteAddress
     * @param security
     */
    public MyProperties2(boolean enabled, InetAddress remoteAddress, Security security) {
        this.enabled = enabled;
        this.remoteAddress = remoteAddress;
        this.security = security;
    }

    public boolean isEnabled() {
        return this.enabled;
    }

    public InetAddress getRemoteAddress() {
        return this.remoteAddress;
    }

    public Security getSecurity() {
        return this.security;
    }

    public static class Security {

        private String username;

        private String password;

        private List<String> roles;

        /**
         * 构造函数绑定类的嵌套成员（如 Security）也将通过其构造函数进行绑定。
         * 可以使用 @DefaultValue 在构造函数参数和记录组件上指定默认值。转换服务将被应用来强制将注解的字符串值转换为缺失属性的目标类型。
         *
         * @param username
         * @param password
         * @param roles
         */
        public Security(String username, String password, @DefaultValue("USER") List<String> roles) {
            this.username = username+" By ";
            this.password = password;
            this.roles = roles;
        }

        public String getUsername() {
            return this.username;
        }

        public String getPassword() {
            return this.password;
        }

        public List<String> getRoles() {
            return this.roles;
        }

    }

}